package com.atguigu.tingshu.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author 路飞
 * @date 2024/7/27 20:29
 * @description 用这个注解来标记哪些接口是要校验是否登录的
 *
 * 登录拦截方案小总结:
 *
 * 登录拦截方案
 *
 * 1.使用过滤器(就是在网关中使用一个全局过滤器进行登录拦截)
 * 特点:这个过滤器在网关中,是一个全局过滤器,只针对模块来处理,拦截的粒度太大了
 * 缺点:如果针对某个模块中的部分方法需要进行登录拦截,部分方法不需要进行登录拦截,那么使用过滤器时实现不了的
 *
 * 2.使用拦截器(我们一般使用拦截器的拦截规则,就是通过URL来进行匹配,符合某个URL,就放行,符合其他的URL就拦截)
 * 特点:拦截器是使用URL来模糊匹配规则,拦截的粒度比上面的小了,但是使用起来不灵活
 * 缺点:使用方式不灵活,比如我们某个接口需要放行,那么这个接口的URL就需要写死,并且修改拦截规则
 * 每操作一个接口,就需要根据情况,修改拦截规则,操作非常不方便
 *
 * 3.使用自定义注解 + AOP实现拦截(在需要认证的地方,直接添加注解即可)
 * 特点:可以针对方法级别,细粒度的控制是否需要拦截,操作起来很方便,直接添加一个注解就行了,就可以实现对应的功能
 * 并且在后续可能有一些特殊情况,针对这个请求,需要进行登录认证(判断用户是否登录了),可以针对它的登录状态,来控制
 * 用户可以查看的页面(具体在后面慢慢体会吧)
 *
 * 所以,最终我们 在项目中使用的登录拦截方案就是 使用 自定义注解 + AOP
 */

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckLogin {

    /**
     * @description 表示是否需要校验登录状态,默认是需要校验登录状态的
     */
    boolean required() default true;
}
